Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  * the IDE Virtual Support Module of AMD CS5536
0004  *
0005  * Copyright (C) 2007 Lemote, Inc.
0006  * Author : jlliu, liujl@lemote.com
0007  *
0008  * Copyright (C) 2009 Lemote, Inc.
0009  * Author: Wu Zhangjin, wuzhangjin@gmail.com
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 }