22 #include "pedigree/kernel/Log.h" 23 #include "pedigree/kernel/processor/PhysicalMemoryManager.h" 24 #include "pedigree/kernel/processor/VirtualAddressSpace.h" 27 IoBase *pRegs,
IoBase *pFb, NvCard card, NvType type, uintptr_t ramSize)
28 : m_pRegs(pRegs), m_pFramebuffer(pFb), m_Card(card), m_Type(type),
29 m_nRamSize(ramSize), m_nDmaBuffer(0), m_pDmaBuffer(0),
30 m_DmaBuffer(
"nVidia DMA Buffer"), m_nPut(0), m_nCurrent(0), m_nMax(0),
42 ERROR(
"NVIDIA: Dma buffer allocation failed!");
45 m_pDmaBuffer =
reinterpret_cast<uint32_t *
>(m_DmaBuffer.virtualAddress());
55 pRegs->
write32(0x13111111, NV32_PWRUPCTRL);
57 pRegs->
write8(0x04, NVCRTCX_REPAINT1);
60 pRegs->
write32(0x00000008, NVACC_PT_NUMERATOR);
62 pRegs->
write32(0x00000003, NVACC_PT_DENOMINATR);
65 pRegs->
write32(0x00000000, NVACC_PT_INTEN);
67 pRegs->
write32(0xffffffff, NVACC_PT_INTSTAT);
74 pRegs->
write32(0x0001114, NV32_PFB_CONFIG_0);
76 else if (m_Type <= NV40 || m_Type == NV45)
79 pRegs->
write32(0, NVACC_NV10_FBTIL0AD);
80 pRegs->
write32(0, NVACC_NV10_FBTIL1AD);
81 pRegs->
write32(0, NVACC_NV10_FBTIL2AD);
82 pRegs->
write32(0, NVACC_NV10_FBTIL3AD);
83 pRegs->
write32(0, NVACC_NV10_FBTIL4AD);
84 pRegs->
write32(0, NVACC_NV10_FBTIL5AD);
85 pRegs->
write32(0, NVACC_NV10_FBTIL6AD);
86 pRegs->
write32(0, NVACC_NV10_FBTIL7AD);
87 pRegs->
write32(m_nRamSize - 1, NVACC_NV10_FBTIL0ED);
88 pRegs->
write32(m_nRamSize - 1, NVACC_NV10_FBTIL1ED);
89 pRegs->
write32(m_nRamSize - 1, NVACC_NV10_FBTIL2ED);
90 pRegs->
write32(m_nRamSize - 1, NVACC_NV10_FBTIL3ED);
91 pRegs->
write32(m_nRamSize - 1, NVACC_NV10_FBTIL4ED);
92 pRegs->
write32(m_nRamSize - 1, NVACC_NV10_FBTIL5ED);
93 pRegs->
write32(m_nRamSize - 1, NVACC_NV10_FBTIL6ED);
94 pRegs->
write32(m_nRamSize - 1, NVACC_NV10_FBTIL7ED);
98 ERROR(
"NVIDIA: Not implemented");
102 for (
int i = 0; i < 0x0400; i++)
103 pRegs->
write32(0x00000000, NVACC_HT_HANDL_00 + (i << 2));
111 0x80000000 | NV10_CONTEXT_SURFACES_2D,
114 0x0010114c, NVACC_HT_VALUE_00);
117 0x80000000 | NV_IMAGE_BLIT,
120 0x00101148, NVACC_HT_VALUE_01);
123 0x80000000 | NV4_GDI_RECTANGLE_TEXT,
126 0x0010114a, NVACC_HT_VALUE_02);
130 0x80000000 | NV_ROP5_SOLID,
133 0x00101142, NVACC_HT_VALUE_10);
136 0x80000000 | NV_IMAGE_BLACK_RECTANGLE,
139 0x00101144, NVACC_HT_VALUE_11);
142 0x80000000 | NV_IMAGE_PATTERN,
145 0x00101146, NVACC_HT_VALUE_12);
148 0x80000000 | NV_SCALED_IMAGE_FROM_MEMORY,
151 0x0010114e, NVACC_HT_VALUE_13);
161 (0x00000000 & 0xfffff000) | 0x00000002,
164 pRegs->
write32(0x00000002, NVACC_PR_CTX3_R);
167 pRegs->
write32(0x02080043, NVACC_PR_CTX0_0);
170 pRegs->
write32(0x00000000, NVACC_PR_CTX1_0);
174 0x00000000, NVACC_PR_CTX2_0);
175 pRegs->
write32(0x00000000, NVACC_PR_CTX3_0);
176 pRegs->
write32(0x00000000, NVACC_PR_CTX0_1);
177 pRegs->
write32(0x00000000, NVACC_PR_CTX1_1);
180 pRegs->
write32(0x02080019, NVACC_PR_CTX0_2);
183 pRegs->
write32(0x00000000, NVACC_PR_CTX1_2);
187 0x00000000, NVACC_PR_CTX2_2);
188 pRegs->
write32(0x00000000, NVACC_PR_CTX3_2);
189 pRegs->
write32(0x00000000, NVACC_PR_CTX0_3);
190 pRegs->
write32(0x00000000, NVACC_PR_CTX1_3);
193 pRegs->
write32(0x02080018, NVACC_PR_CTX0_4);
196 pRegs->
write32(0x00000000, NVACC_PR_CTX1_4);
200 0x00000000, NVACC_PR_CTX2_4);
201 pRegs->
write32(0x00000000, NVACC_PR_CTX3_4);
202 pRegs->
write32(0x00000000, NVACC_PR_CTX0_5);
203 pRegs->
write32(0x00000000, NVACC_PR_CTX1_5);
206 pRegs->
write32(0x0208009f, NVACC_PR_CTX0_6);
209 pRegs->
write32(0x00000000, NVACC_PR_CTX1_6);
216 0x00001140, NVACC_PR_CTX3_6);
217 pRegs->
write32(0x00000000, NVACC_PR_CTX0_7);
218 pRegs->
write32(0x00000000, NVACC_PR_CTX1_7);
221 pRegs->
write32(0x0208004a, NVACC_PR_CTX0_8);
228 0x00000000, NVACC_PR_CTX2_8);
229 pRegs->
write32(0x00000000, NVACC_PR_CTX3_8);
230 pRegs->
write32(0x00000000, NVACC_PR_CTX0_9);
231 pRegs->
write32(0x00000000, NVACC_PR_CTX1_9);
237 pRegs->
write32(0x00000000, NVACC_PR_CTX1_A);
244 0x00001140, NVACC_PR_CTX3_A);
245 pRegs->
write32(0x00000000, NVACC_PR_CTX0_B);
246 pRegs->
write32(0x00000000, NVACC_PR_CTX1_B);
250 0x02080077, NVACC_PR_CTX0_C);
251 pRegs->
write32(0x00000000, NVACC_PR_CTX1_C);
258 0x00001140, NVACC_PR_CTX3_C);
259 pRegs->
write32(0x00000000, NVACC_PR_CTX0_D);
260 pRegs->
write32(0x00000000, NVACC_PR_CTX1_D);
267 0x00007fff, NVACC_PR_CTX1_E);
269 ((m_nRamSize - 1) & 0xffff8000) | 0x00000002,
273 m_nDmaBuffer = (m_nRamSize - 1) & 0xffff8000;
281 0x80000000 | NV4_SURFACE,
284 0x80011145, NVACC_HT_VALUE_00);
287 0x80000000 | NV_IMAGE_BLIT,
290 0x80011146, NVACC_HT_VALUE_01);
293 0x80000000 | NV4_GDI_RECTANGLE_TEXT,
296 0x80011147, NVACC_HT_VALUE_02);
299 0x80000000 | NV4_CONTEXT_SURFACES_ARGB_ZS,
302 0x80011148, NVACC_HT_VALUE_03);
305 0x80000000 | NV4_DX5_TEXTURE_TRIANGLE,
308 0x80011149, NVACC_HT_VALUE_04);
311 0x80000000 | NV4_DX6_MULTI_TEXTURE_TRIANGLE,
314 0x8001114a, NVACC_HT_VALUE_05);
317 0x80000000 | NV1_RENDER_SOLID_LIN,
320 0x8001114c, NVACC_HT_VALUE_06);
324 0x80000000 | NV_ROP5_SOLID,
327 0x80011142, NVACC_HT_VALUE_10);
330 0x80000000 | NV_IMAGE_BLACK_RECTANGLE,
333 0x80011143, NVACC_HT_VALUE_11);
336 0x80000000 | NV_IMAGE_PATTERN,
339 0x80011144, NVACC_HT_VALUE_12);
342 0x80000000 | NV_SCALED_IMAGE_FROM_MEMORY,
345 0x8001114b, NVACC_HT_VALUE_13);
355 (0x00000000 & 0xfffff000) | 0x00000002,
358 pRegs->
write32(0x00000002, NVACC_PR_CTX3_R);
361 pRegs->
write32(0x01080043, NVACC_PR_CTX0_0);
364 pRegs->
write32(0x00000000, NVACC_PR_CTX1_0);
368 0x00000000, NVACC_PR_CTX2_0);
369 pRegs->
write32(0x00000000, NVACC_PR_CTX3_0);
372 pRegs->
write32(0x01080019, NVACC_PR_CTX0_1);
375 pRegs->
write32(0x00000000, NVACC_PR_CTX1_1);
379 0x00000000, NVACC_PR_CTX2_1);
380 pRegs->
write32(0x00000000, NVACC_PR_CTX3_1);
383 pRegs->
write32(0x01080018, NVACC_PR_CTX0_2);
386 pRegs->
write32(0x00000002, NVACC_PR_CTX1_2);
390 0x00000000, NVACC_PR_CTX2_2);
391 pRegs->
write32(0x00000000, NVACC_PR_CTX3_2);
396 pRegs->
write32(0x01008062, NVACC_PR_CTX0_3);
399 pRegs->
write32(0x01008042, NVACC_PR_CTX0_3);
400 pRegs->
write32(0x00000000, NVACC_PR_CTX1_3);
404 0x11401140, NVACC_PR_CTX2_3);
405 pRegs->
write32(0x00000000, NVACC_PR_CTX3_3);
409 pRegs->
write32(0x0100809f, NVACC_PR_CTX0_4);
415 pRegs->
write32(0x0100805f, NVACC_PR_CTX0_4);
416 pRegs->
write32(0x00000000, NVACC_PR_CTX1_4);
423 0x00000000, NVACC_PR_CTX3_4);
426 pRegs->
write32(0x0100804a, NVACC_PR_CTX0_5);
433 0x00000000, NVACC_PR_CTX2_5);
434 pRegs->
write32(0x00000000, NVACC_PR_CTX3_5);
444 pRegs->
write32(0x00000053, NVACC_PR_CTX0_6);
445 pRegs->
write32(0x00000000, NVACC_PR_CTX1_6);
452 0x00000000, NVACC_PR_CTX3_6);
462 pRegs->
write32(0x0300a054, NVACC_PR_CTX0_7);
463 pRegs->
write32(0x00000000, NVACC_PR_CTX1_7);
470 0x00000000, NVACC_PR_CTX3_7);
480 pRegs->
write32(0x0300a055, NVACC_PR_CTX0_8);
481 pRegs->
write32(0x00000000, NVACC_PR_CTX1_8);
488 0x00000000, NVACC_PR_CTX3_8);
492 0x01018077, NVACC_PR_CTX0_9);
493 pRegs->
write32(0x00000000, NVACC_PR_CTX1_9);
500 0x00000000, NVACC_PR_CTX3_9);
504 0x0300a01c, NVACC_PR_CTX0_A);
505 pRegs->
write32(0x00000000, NVACC_PR_CTX1_A);
512 0x00000000, NVACC_PR_CTX3_A);
525 0x00007fff, NVACC_PR_CTX1_C);
527 m_DmaBuffer.physicalAddress() | 0x00000002,
531 pRegs->
write32(0x00000500, NVACC_BPIXEL);
535 pRegs->
write32(0xffffffff, NVACC_DEBUG0);
536 pRegs->
write32(0x00000000, NVACC_DEBUG0);
539 pRegs->
write32(0x00000000, NVACC_ACC_INTE);
541 pRegs->
write32(0xffffffff, NVACC_ACC_INTS);
544 pRegs->
write32(0x10010100, NVACC_NV10_CTX_CTRL);
546 pRegs->
write32(0xffffffff, NVACC_NV10_ACC_STAT);
548 pRegs->
write32(0x00000001, NVACC_FIFO_EN);
551 pRegs->
read32(NVACC_NV10_SURF_TYP) & 0x0007ff00, NVACC_NV10_SURF_TYP);
553 pRegs->
read32(NVACC_NV10_SURF_TYP) | 0x00020101, NVACC_NV10_SURF_TYP);
556 setUpReverseEngineeredMagicRegs();
559 pRegs->
write32(0x00000000, NVACC_ABS_UCLP_XMIN);
560 pRegs->
write32(0x00000000, NVACC_ABS_UCLP_YMIN);
561 pRegs->
write32(0x00007fff, NVACC_ABS_UCLP_XMAX);
562 pRegs->
write32(0x00007fff, NVACC_ABS_UCLP_YMAX);
568 pRegs->
write32(0x00000000, NVACC_PF_CACHES);
570 pRegs->
write32(0x00000001, NVACC_PF_MODE);
572 pRegs->
write32(0x00000000, NVACC_PF_CACH1_PSH0);
574 pRegs->
write32(0x00000000, NVACC_PF_CACH1_PUL0);
577 pRegs->
write32(0x00010000, NVACC_PF_CACH1_PSH1);
579 pRegs->
write32(0x00000100, NVACC_PF_CACH1_PSH1);
581 pRegs->
write32(0x00000000, NVACC_PF_CACH1_DMAP);
583 pRegs->
write32(0x00000000, NVACC_PF_CACH1_DMAG);
587 pRegs->
write32(0x00001150, NVACC_PF_CACH1_DMAI);
589 pRegs->
write32(0x0000114e, NVACC_PF_CACH1_DMAI);
591 pRegs->
write32(0x00000000, NVACC_PF_CACH0_PSH0);
593 pRegs->
write32(0x00000000, NVACC_PF_CACH0_PUL0);
602 pRegs->
write32(0x03000100, NVACC_PF_RAMHT);
604 pRegs->
write32(0x00000110, NVACC_PF_RAMFC);
606 pRegs->
write32(0x00000112, NVACC_PF_RAMRO);
608 pRegs->
write32(0x0000ffff, NVACC_PF_SIZE);
610 pRegs->
write32(0x0000ffff, NVACC_PF_CACH1_HASH);
612 pRegs->
write32(0x00000000, NVACC_PF_INTEN);
614 pRegs->
write32(0xffffffff, NVACC_PF_INTSTAT);
616 pRegs->
write32(0x00000001, NVACC_PF_CACH0_PUL1);
618 pRegs->
write32(0x00000000, NVACC_PF_CACH1_DMAC);
621 pRegs->
write32(0x00000000, NVACC_PF_CACH1_ENG);
624 pRegs->
write32(0x000f0078, NVACC_PF_CACH1_DMAF);
626 pRegs->
write32(0x00000001, NVACC_PF_CACH1_DMAS);
628 pRegs->
write32(0x00000001, NVACC_PF_CACH1_PSH0);
630 pRegs->
write32(0x00000001, NVACC_PF_CACH1_PUL0);
632 pRegs->
write32(0x00000001, NVACC_PF_CACH1_PUL1);
634 pRegs->
write32(0x00000001, NVACC_PF_CACHES);
649 m_pFifoPtrs[NV_ROP5_SOLID] = 0 * 0x00002000;
650 m_pFifoPtrs[NV_IMAGE_BLACK_RECTANGLE] = 1 * 0x00002000;
651 m_pFifoPtrs[NV_IMAGE_PATTERN] = 2 * 0x00002000;
652 m_pFifoPtrs[NV4_SURFACE] = 3 * 0x00002000;
653 m_pFifoPtrs[NV_IMAGE_BLIT] = 4 * 0x00002000;
654 m_pFifoPtrs[NV4_GDI_RECTANGLE_TEXT] = 5 * 0x00002000;
655 m_pFifoPtrs[NV4_CONTEXT_SURFACES_ARGB_ZS] = 6 * 0x00002000;
656 m_pFifoPtrs[NV4_DX5_TEXTURE_TRIANGLE] = 7 * 0x00002000;
658 m_pFifos[0] = NV_ROP5_SOLID;
659 m_pFifos[1] = NV_IMAGE_BLACK_RECTANGLE;
660 m_pFifos[2] = NV_IMAGE_PATTERN;
661 m_pFifos[3] = NV4_SURFACE;
662 m_pFifos[4] = NV_IMAGE_BLIT;
663 m_pFifos[5] = NV4_GDI_RECTANGLE_TEXT;
664 m_pFifos[6] = NV_SCALED_IMAGE_FROM_MEMORY;
666 initFifo(NV_GENERAL_FIFO_CH0, m_pFifos[0]);
667 initFifo(NV_GENERAL_FIFO_CH1, m_pFifos[1]);
668 initFifo(NV_GENERAL_FIFO_CH2, m_pFifos[2]);
669 initFifo(NV_GENERAL_FIFO_CH3, m_pFifos[3]);
670 initFifo(NV_GENERAL_FIFO_CH4, m_pFifos[4]);
671 initFifo(NV_GENERAL_FIFO_CH5, m_pFifos[5]);
672 initFifo(NV_GENERAL_FIFO_CH6, m_pFifos[6]);
676 dmaCmd(NV4_SURFACE, NV4_SURFACE_FORMAT, 4);
678 writeBuffer(2048 | (2048 << 16));
684 dmaCmd(NV_IMAGE_PATTERN, NV_IMAGE_PATTERN_SETCOLORFORMAT, 1);
688 dmaCmd(NV4_GDI_RECTANGLE_TEXT, NV4_GDI_RECTANGLE_TEXT_SETCOLORFORMAT, 1);
693 dmaCmd(NV_IMAGE_PATTERN, NV_IMAGE_PATTERN_SETSHAPE, 1);
694 writeBuffer(0x00000000);
695 dmaCmd(NV_IMAGE_PATTERN, NV_IMAGE_PATTERN_SETCOLOR0, 4);
696 writeBuffer(0xffffffff);
697 writeBuffer(0xffffffff);
698 writeBuffer(0xffffffff);
699 writeBuffer(0xffffffff);
709 void Dma::dmaCmd(uint32_t
cmd, uint32_t offset, uint16_t size)
712 m_pFramebuffer->write32(
713 (size << 18) | ((m_pFifoPtrs[cmd] + offset) & 0x0000fffc),
714 m_nDmaBuffer + ((m_nCurrent++) << 2));
716 m_pDmaBuffer[m_nCurrent++] =
717 ((size << 18) | ((m_pFifoPtrs[cmd] + offset) & 0x0000fffc));
718 m_nFree -= (size + 1);
721 void Dma::writeBuffer(uint32_t arg)
724 m_pFramebuffer->write32(arg, m_nDmaBuffer + ((m_nCurrent++) << 2));
726 m_pDmaBuffer[m_nCurrent++] = arg;
731 if (m_nCurrent != m_nPut)
734 m_pRegs->write32(m_nPut << 2, NVACC_FIFO + NV_GENERAL_DMAPUT);
738 void Dma::ensureFree(uint16_t cmd_size)
740 while ((m_nFree < cmd_size))
742 uint32_t dmaget = m_pRegs->read32(NVACC_FIFO + NV_GENERAL_DMAGET) >> 2;
744 if (m_nPut >= dmaget)
749 m_nFree = m_nMax - m_nCurrent;
750 if (m_nFree < cmd_size)
754 writeBuffer(0x20000000);
760 m_nFree = dmaget - m_nCurrent;
774 m_nFree = dmaget - m_nCurrent;
786 void Dma::initFifo(uint32_t ch, uint32_t handle)
789 NOTICE(
"initFifo: put: " <<
Hex << m_nPut <<
", cur: " << m_nCurrent);
790 writeBuffer((1 << 18) | ch);
791 writeBuffer(0x80000000 | handle);
796 void Dma::screenToScreenBlit(
797 uint16_t src_x, uint16_t src_y, uint16_t dest_x, uint16_t dest_y,
798 uint16_t h, uint16_t w)
803 dmaCmd(NV_ROP5_SOLID, NV_ROP5_SOLID_SETROP5, 1);
808 dmaCmd(NV_IMAGE_BLIT, NV_IMAGE_BLIT_SOURCEORG, 3);
809 writeBuffer((src_y << 16) | src_x);
810 writeBuffer((dest_y << 16) | dest_x);
811 writeBuffer(((h + 1) << 16) | (w + 1));
814 NOTICE(
"screenToScreenBlit -- end");
817 void Dma::fillRectangle(uint16_t x, uint16_t y, uint16_t h, uint16_t w)
819 uint32_t c = 0xFFFFFFFF;
824 dmaCmd(NV_ROP5_SOLID, NV_ROP5_SOLID_SETROP5, 1);
828 dmaCmd(NV4_GDI_RECTANGLE_TEXT, NV4_GDI_RECTANGLE_TEXT_COLOR1A, 1);
833 dmaCmd(NV4_GDI_RECTANGLE_TEXT, NV4_GDI_RECTANGLE_TEXT_UCR0_LEFTTOP, 2);
834 writeBuffer((x << 16) | (y & 0xffff));
835 writeBuffer(((w + 1) << 16) | (h + 1));
840 void Dma::setUpReverseEngineeredMagicRegs()
847 m_pRegs->write32(0x401287c0, NVACC_DEBUG1);
848 m_pRegs->write32(0x60de8051, NVACC_DEBUG3);
850 m_pRegs->write32(0x00008000, NVACC_NV10_DEBUG4);
851 m_pRegs->write32(0x00be3c5f, NVACC_NV25_WHAT0);
854 uint32_t tmp = m_pRegs->read32(NV32_NV4X_WHAT0) & 0xff;
855 for (
int cnt = 0; (tmp && !(tmp & 0x1)); tmp >>= 1, cnt++)
856 m_pRegs->write32(cnt, NVACC_NV4X_WHAT2);
858 int m_CardType = NV40;
863 m_pRegs->write32(0x83280fff, NVACC_NV40_WHAT0);
864 m_pRegs->write32(0x000000a0, NVACC_NV40_WHAT1);
865 m_pRegs->write32(0x0078e366, NVACC_NV40_WHAT2);
866 m_pRegs->write32(0x0000014c, NVACC_NV40_WHAT3);
870 m_pRegs->write32(0x2ffff800, NVACC_NV10_TIL3PT);
871 m_pRegs->write32(0x00006000, NVACC_NV10_TIL3ST);
872 m_pRegs->write32(0x01000000, NVACC_NV4X_WHAT1);
874 m_pRegs->write32(0x00001140, NVACC_NV4X_DMA_SRC);
880 m_pRegs->write32(0x40108700, NVACC_DEBUG1);
881 m_pRegs->write32(0x00140000, NVACC_NV25_WHAT1);
882 m_pRegs->write32(0xf00e0431, NVACC_DEBUG3);
883 m_pRegs->write32(0x00008000, NVACC_NV10_DEBUG4);
884 m_pRegs->write32(0xf04b1f36, NVACC_NV25_WHAT0);
885 m_pRegs->write32(0x1002d888, NVACC_NV20_WHAT3);
886 m_pRegs->write32(0x62ff007f, NVACC_NV25_WHAT2);
889 for (
int i = 0; i < 32; i++)
893 m_pRegs->read32(NVACC_NV10_FBTIL0AD + (i << 2)),
894 NVACC_NV20_WHAT0 + (i << 2));
896 m_pRegs->read32(NVACC_NV10_FBTIL0AD + (i << 2)),
897 NVACC_NV20_2_WHAT0 + (i << 2));
902 m_pRegs->read32(NV32_PFB_CONFIG_0), NVACC_NV20_WHAT_T0);
904 m_pRegs->read32(NV32_PFB_CONFIG_1), NVACC_NV20_WHAT_T1);
906 m_pRegs->write32(0x00ea0000, NVACC_RDI_INDEX);
908 m_pRegs->read32(NV32_PFB_CONFIG_0), NVACC_RDI_DATA);
910 m_pRegs->write32(0x00ea0004, NVACC_RDI_INDEX);
912 m_pRegs->read32(NV32_PFB_CONFIG_1), NVACC_RDI_DATA);
917 m_pRegs->write32(0, NVACC_NV20_OFFSET0);
918 m_pRegs->write32(0, NVACC_NV20_OFFSET1);
925 m_pRegs->write32(m_nRamSize - 1, NVACC_NV20_BLIMIT6);
926 m_pRegs->write32(m_nRamSize - 1, NVACC_NV20_BLIMIT7);
928 m_pRegs->write32(0x00000000, NVACC_NV10_TIL2AD);
929 m_pRegs->write32(0xffffffff, NVACC_NV10_TIL0ED);
static PhysicalMemoryManager & instance()
static const size_t continuous
virtual void write8(uint8_t value, size_t offset=0)=0
Abstrace base class for hardware I/O capabilities.
static const size_t Write
static const size_t KernelMode
virtual uint32_t read32(size_t offset=0)=0
static const size_t below16MB
static const size_t nonRamMemory
virtual void write32(uint32_t value, size_t offset=0)=0