0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include <cs5536/cs5536.h>
0013 #include <cs5536/cs5536_pci.h>
0014
0015 void pci_ide_write_reg(int reg, u32 value)
0016 {
0017 u32 hi = 0, lo = value;
0018
0019 switch (reg) {
0020 case PCI_COMMAND:
0021 _rdmsr(GLIU_MSR_REG(GLIU_PAE), &hi, &lo);
0022 if (value & PCI_COMMAND_MASTER)
0023 lo |= (0x03 << 4);
0024 else
0025 lo &= ~(0x03 << 4);
0026 _wrmsr(GLIU_MSR_REG(GLIU_PAE), hi, lo);
0027 break;
0028 case PCI_STATUS:
0029 if (value & PCI_STATUS_PARITY) {
0030 _rdmsr(SB_MSR_REG(SB_ERROR), &hi, &lo);
0031 if (lo & SB_PARE_ERR_FLAG) {
0032 lo = (lo & 0x0000ffff) | SB_PARE_ERR_FLAG;
0033 _wrmsr(SB_MSR_REG(SB_ERROR), hi, lo);
0034 }
0035 }
0036 break;
0037 case PCI_CACHE_LINE_SIZE:
0038 value &= 0x0000ff00;
0039 _rdmsr(SB_MSR_REG(SB_CTRL), &hi, &lo);
0040 hi &= 0xffffff00;
0041 hi |= (value >> 8);
0042 _wrmsr(SB_MSR_REG(SB_CTRL), hi, lo);
0043 break;
0044 case PCI_BAR4_REG:
0045 if (value == PCI_BAR_RANGE_MASK) {
0046 _rdmsr(GLCP_MSR_REG(GLCP_SOFT_COM), &hi, &lo);
0047 lo |= SOFT_BAR_IDE_FLAG;
0048 _wrmsr(GLCP_MSR_REG(GLCP_SOFT_COM), hi, lo);
0049 } else if (value & 0x01) {
0050 _rdmsr(IDE_MSR_REG(IDE_IO_BAR), &hi, &lo);
0051 lo = (value & 0xfffffff0) | 0x1;
0052 _wrmsr(IDE_MSR_REG(IDE_IO_BAR), hi, lo);
0053
0054 value &= 0xfffffffc;
0055 hi = 0x60000000 | ((value & 0x000ff000) >> 12);
0056 lo = 0x000ffff0 | ((value & 0x00000fff) << 20);
0057 _wrmsr(GLIU_MSR_REG(GLIU_IOD_BM2), hi, lo);
0058 }
0059 break;
0060 case PCI_IDE_CFG_REG:
0061 if (value == CS5536_IDE_FLASH_SIGNATURE) {
0062 _rdmsr(DIVIL_MSR_REG(DIVIL_BALL_OPTS), &hi, &lo);
0063 lo |= 0x01;
0064 _wrmsr(DIVIL_MSR_REG(DIVIL_BALL_OPTS), hi, lo);
0065 } else {
0066 _rdmsr(IDE_MSR_REG(IDE_CFG), &hi, &lo);
0067 lo = value;
0068 _wrmsr(IDE_MSR_REG(IDE_CFG), hi, lo);
0069 }
0070 break;
0071 case PCI_IDE_DTC_REG:
0072 _rdmsr(IDE_MSR_REG(IDE_DTC), &hi, &lo);
0073 lo = value;
0074 _wrmsr(IDE_MSR_REG(IDE_DTC), hi, lo);
0075 break;
0076 case PCI_IDE_CAST_REG:
0077 _rdmsr(IDE_MSR_REG(IDE_CAST), &hi, &lo);
0078 lo = value;
0079 _wrmsr(IDE_MSR_REG(IDE_CAST), hi, lo);
0080 break;
0081 case PCI_IDE_ETC_REG:
0082 _rdmsr(IDE_MSR_REG(IDE_ETC), &hi, &lo);
0083 lo = value;
0084 _wrmsr(IDE_MSR_REG(IDE_ETC), hi, lo);
0085 break;
0086 case PCI_IDE_PM_REG:
0087 _rdmsr(IDE_MSR_REG(IDE_INTERNAL_PM), &hi, &lo);
0088 lo = value;
0089 _wrmsr(IDE_MSR_REG(IDE_INTERNAL_PM), hi, lo);
0090 break;
0091 default:
0092 break;
0093 }
0094 }
0095
0096 u32 pci_ide_read_reg(int reg)
0097 {
0098 u32 conf_data = 0;
0099 u32 hi, lo;
0100
0101 switch (reg) {
0102 case PCI_VENDOR_ID:
0103 conf_data =
0104 CFG_PCI_VENDOR_ID(CS5536_IDE_DEVICE_ID, CS5536_VENDOR_ID);
0105 break;
0106 case PCI_COMMAND:
0107 _rdmsr(IDE_MSR_REG(IDE_IO_BAR), &hi, &lo);
0108 if (lo & 0xfffffff0)
0109 conf_data |= PCI_COMMAND_IO;
0110 _rdmsr(GLIU_MSR_REG(GLIU_PAE), &hi, &lo);
0111 if ((lo & 0x30) == 0x30)
0112 conf_data |= PCI_COMMAND_MASTER;
0113 break;
0114 case PCI_STATUS:
0115 conf_data |= PCI_STATUS_66MHZ;
0116 conf_data |= PCI_STATUS_FAST_BACK;
0117 _rdmsr(SB_MSR_REG(SB_ERROR), &hi, &lo);
0118 if (lo & SB_PARE_ERR_FLAG)
0119 conf_data |= PCI_STATUS_PARITY;
0120 conf_data |= PCI_STATUS_DEVSEL_MEDIUM;
0121 break;
0122 case PCI_CLASS_REVISION:
0123 _rdmsr(IDE_MSR_REG(IDE_CAP), &hi, &lo);
0124 conf_data = lo & 0x000000ff;
0125 conf_data |= (CS5536_IDE_CLASS_CODE << 8);
0126 break;
0127 case PCI_CACHE_LINE_SIZE:
0128 _rdmsr(SB_MSR_REG(SB_CTRL), &hi, &lo);
0129 hi &= 0x000000f8;
0130 conf_data = CFG_PCI_CACHE_LINE_SIZE(PCI_NORMAL_HEADER_TYPE, hi);
0131 break;
0132 case PCI_BAR4_REG:
0133 _rdmsr(GLCP_MSR_REG(GLCP_SOFT_COM), &hi, &lo);
0134 if (lo & SOFT_BAR_IDE_FLAG) {
0135 conf_data = CS5536_IDE_RANGE |
0136 PCI_BASE_ADDRESS_SPACE_IO;
0137 lo &= ~SOFT_BAR_IDE_FLAG;
0138 _wrmsr(GLCP_MSR_REG(GLCP_SOFT_COM), hi, lo);
0139 } else {
0140 _rdmsr(IDE_MSR_REG(IDE_IO_BAR), &hi, &lo);
0141 conf_data = lo & 0xfffffff0;
0142 conf_data |= 0x01;
0143 conf_data &= ~0x02;
0144 }
0145 break;
0146 case PCI_CARDBUS_CIS:
0147 conf_data = PCI_CARDBUS_CIS_POINTER;
0148 break;
0149 case PCI_SUBSYSTEM_VENDOR_ID:
0150 conf_data =
0151 CFG_PCI_VENDOR_ID(CS5536_IDE_SUB_ID, CS5536_SUB_VENDOR_ID);
0152 break;
0153 case PCI_ROM_ADDRESS:
0154 conf_data = PCI_EXPANSION_ROM_BAR;
0155 break;
0156 case PCI_CAPABILITY_LIST:
0157 conf_data = PCI_CAPLIST_POINTER;
0158 break;
0159 case PCI_INTERRUPT_LINE:
0160 conf_data =
0161 CFG_PCI_INTERRUPT_LINE(PCI_DEFAULT_PIN, CS5536_IDE_INTR);
0162 break;
0163 case PCI_IDE_CFG_REG:
0164 _rdmsr(IDE_MSR_REG(IDE_CFG), &hi, &lo);
0165 conf_data = lo;
0166 break;
0167 case PCI_IDE_DTC_REG:
0168 _rdmsr(IDE_MSR_REG(IDE_DTC), &hi, &lo);
0169 conf_data = lo;
0170 break;
0171 case PCI_IDE_CAST_REG:
0172 _rdmsr(IDE_MSR_REG(IDE_CAST), &hi, &lo);
0173 conf_data = lo;
0174 break;
0175 case PCI_IDE_ETC_REG:
0176 _rdmsr(IDE_MSR_REG(IDE_ETC), &hi, &lo);
0177 conf_data = lo;
0178 break;
0179 case PCI_IDE_PM_REG:
0180 _rdmsr(IDE_MSR_REG(IDE_INTERNAL_PM), &hi, &lo);
0181 conf_data = lo;
0182 break;
0183 default:
0184 break;
0185 }
0186
0187 return conf_data;
0188 }