+ struct sAHCI_RcvdFIS *fis_vpage = NULL;
+ struct sAHCI_CmdHdr *cl_vpage = NULL;
+ for( int i = 0; i < Ctrlr->PortCount; i ++ )
+ {
+ // CLB First (1 KB alignemnt)
+ if( ((tVAddr)cl_vpage & 0xFFF) == 0 ) {
+ cl_vpage = AHCI_AllocPage(Ctrlr, "CLB");
+ if( !cl_vpage )
+ return MODULE_ERR_MALLOC;
+ }
+ Ctrlr->Ports[i].CmdList = cl_vpage;
+ cl_vpage += 1024/sizeof(*cl_vpage);
+
+ tPAddr cl_paddr = MM_GetPhysAddr(Ctrlr->Ports[i].CmdList);
+ Ctrlr->Ports[i].MMIO->PxCLB = cl_paddr;
+ #if PHYS_BITS > 32
+ Ctrlr->Ports[i].MMIO->PxCLBU = cl_paddr >> 32;
+ #endif
+
+ // Received FIS Area
+ // - If there is space for the FIS in the end of the 1K block, use it
+ if( Ctrlr->NCS <= (1024-256)/32 )
+ {
+ Ctrlr->Ports[i].RcvdFIS = (void*)(cl_vpage - 256/32);
+ }
+ else
+ {
+ if( ((tVAddr)fis_vpage & 0xFFF) == 0 ) {
+ fis_vpage = AHCI_AllocPage(Ctrlr, "FIS");
+ if( !fis_vpage )
+ return MODULE_ERR_MALLOC;
+ }
+ Ctrlr->Ports[i].RcvdFIS = fis_vpage;
+ fis_vpage ++;
+ }
+ tPAddr fis_paddr = MM_GetPhysAddr(Ctrlr->Ports[i].RcvdFIS);
+ Ctrlr->Ports[i].MMIO->PxFB = fis_paddr;
+ #if PHYS_BITS > 32
+ Ctrlr->Ports[i].MMIO->PxFBU = fis_paddr >> 32;
+ #endif
+
+ LOG("Port #%i: CLB=%p/%P, FB=%p/%P", i,
+ Ctrlr->Ports[i].CmdList, cl_paddr,
+ Ctrlr->Ports[i].RcvdFIS, fis_paddr);
+ }