Path: blob/master/arch/mips/loongson/common/cs5536/cs5536_ide.c
10820 views
/*1* the IDE Virtual Support Module of AMD CS55362*3* Copyright (C) 2007 Lemote, Inc.4* Author : jlliu, [email protected]5*6* Copyright (C) 2009 Lemote, Inc.7* Author: Wu Zhangjin, [email protected]8*9* This program is free software; you can redistribute it and/or modify it10* under the terms of the GNU General Public License as published by the11* Free Software Foundation; either version 2 of the License, or (at your12* option) any later version.13*/1415#include <cs5536/cs5536.h>16#include <cs5536/cs5536_pci.h>1718void pci_ide_write_reg(int reg, u32 value)19{20u32 hi = 0, lo = value;2122switch (reg) {23case PCI_COMMAND:24_rdmsr(GLIU_MSR_REG(GLIU_PAE), &hi, &lo);25if (value & PCI_COMMAND_MASTER)26lo |= (0x03 << 4);27else28lo &= ~(0x03 << 4);29_wrmsr(GLIU_MSR_REG(GLIU_PAE), hi, lo);30break;31case PCI_STATUS:32if (value & PCI_STATUS_PARITY) {33_rdmsr(SB_MSR_REG(SB_ERROR), &hi, &lo);34if (lo & SB_PARE_ERR_FLAG) {35lo = (lo & 0x0000ffff) | SB_PARE_ERR_FLAG;36_wrmsr(SB_MSR_REG(SB_ERROR), hi, lo);37}38}39break;40case PCI_CACHE_LINE_SIZE:41value &= 0x0000ff00;42_rdmsr(SB_MSR_REG(SB_CTRL), &hi, &lo);43hi &= 0xffffff00;44hi |= (value >> 8);45_wrmsr(SB_MSR_REG(SB_CTRL), hi, lo);46break;47case PCI_BAR4_REG:48if (value == PCI_BAR_RANGE_MASK) {49_rdmsr(GLCP_MSR_REG(GLCP_SOFT_COM), &hi, &lo);50lo |= SOFT_BAR_IDE_FLAG;51_wrmsr(GLCP_MSR_REG(GLCP_SOFT_COM), hi, lo);52} else if (value & 0x01) {53_rdmsr(IDE_MSR_REG(IDE_IO_BAR), &hi, &lo);54lo = (value & 0xfffffff0) | 0x1;55_wrmsr(IDE_MSR_REG(IDE_IO_BAR), hi, lo);5657value &= 0xfffffffc;58hi = 0x60000000 | ((value & 0x000ff000) >> 12);59lo = 0x000ffff0 | ((value & 0x00000fff) << 20);60_wrmsr(GLIU_MSR_REG(GLIU_IOD_BM2), hi, lo);61}62break;63case PCI_IDE_CFG_REG:64if (value == CS5536_IDE_FLASH_SIGNATURE) {65_rdmsr(DIVIL_MSR_REG(DIVIL_BALL_OPTS), &hi, &lo);66lo |= 0x01;67_wrmsr(DIVIL_MSR_REG(DIVIL_BALL_OPTS), hi, lo);68} else {69_rdmsr(IDE_MSR_REG(IDE_CFG), &hi, &lo);70lo = value;71_wrmsr(IDE_MSR_REG(IDE_CFG), hi, lo);72}73break;74case PCI_IDE_DTC_REG:75_rdmsr(IDE_MSR_REG(IDE_DTC), &hi, &lo);76lo = value;77_wrmsr(IDE_MSR_REG(IDE_DTC), hi, lo);78break;79case PCI_IDE_CAST_REG:80_rdmsr(IDE_MSR_REG(IDE_CAST), &hi, &lo);81lo = value;82_wrmsr(IDE_MSR_REG(IDE_CAST), hi, lo);83break;84case PCI_IDE_ETC_REG:85_rdmsr(IDE_MSR_REG(IDE_ETC), &hi, &lo);86lo = value;87_wrmsr(IDE_MSR_REG(IDE_ETC), hi, lo);88break;89case PCI_IDE_PM_REG:90_rdmsr(IDE_MSR_REG(IDE_INTERNAL_PM), &hi, &lo);91lo = value;92_wrmsr(IDE_MSR_REG(IDE_INTERNAL_PM), hi, lo);93break;94default:95break;96}97}9899u32 pci_ide_read_reg(int reg)100{101u32 conf_data = 0;102u32 hi, lo;103104switch (reg) {105case PCI_VENDOR_ID:106conf_data =107CFG_PCI_VENDOR_ID(CS5536_IDE_DEVICE_ID, CS5536_VENDOR_ID);108break;109case PCI_COMMAND:110_rdmsr(IDE_MSR_REG(IDE_IO_BAR), &hi, &lo);111if (lo & 0xfffffff0)112conf_data |= PCI_COMMAND_IO;113_rdmsr(GLIU_MSR_REG(GLIU_PAE), &hi, &lo);114if ((lo & 0x30) == 0x30)115conf_data |= PCI_COMMAND_MASTER;116break;117case PCI_STATUS:118conf_data |= PCI_STATUS_66MHZ;119conf_data |= PCI_STATUS_FAST_BACK;120_rdmsr(SB_MSR_REG(SB_ERROR), &hi, &lo);121if (lo & SB_PARE_ERR_FLAG)122conf_data |= PCI_STATUS_PARITY;123conf_data |= PCI_STATUS_DEVSEL_MEDIUM;124break;125case PCI_CLASS_REVISION:126_rdmsr(IDE_MSR_REG(IDE_CAP), &hi, &lo);127conf_data = lo & 0x000000ff;128conf_data |= (CS5536_IDE_CLASS_CODE << 8);129break;130case PCI_CACHE_LINE_SIZE:131_rdmsr(SB_MSR_REG(SB_CTRL), &hi, &lo);132hi &= 0x000000f8;133conf_data = CFG_PCI_CACHE_LINE_SIZE(PCI_NORMAL_HEADER_TYPE, hi);134break;135case PCI_BAR4_REG:136_rdmsr(GLCP_MSR_REG(GLCP_SOFT_COM), &hi, &lo);137if (lo & SOFT_BAR_IDE_FLAG) {138conf_data = CS5536_IDE_RANGE |139PCI_BASE_ADDRESS_SPACE_IO;140lo &= ~SOFT_BAR_IDE_FLAG;141_wrmsr(GLCP_MSR_REG(GLCP_SOFT_COM), hi, lo);142} else {143_rdmsr(IDE_MSR_REG(IDE_IO_BAR), &hi, &lo);144conf_data = lo & 0xfffffff0;145conf_data |= 0x01;146conf_data &= ~0x02;147}148break;149case PCI_CARDBUS_CIS:150conf_data = PCI_CARDBUS_CIS_POINTER;151break;152case PCI_SUBSYSTEM_VENDOR_ID:153conf_data =154CFG_PCI_VENDOR_ID(CS5536_IDE_SUB_ID, CS5536_SUB_VENDOR_ID);155break;156case PCI_ROM_ADDRESS:157conf_data = PCI_EXPANSION_ROM_BAR;158break;159case PCI_CAPABILITY_LIST:160conf_data = PCI_CAPLIST_POINTER;161break;162case PCI_INTERRUPT_LINE:163conf_data =164CFG_PCI_INTERRUPT_LINE(PCI_DEFAULT_PIN, CS5536_IDE_INTR);165break;166case PCI_IDE_CFG_REG:167_rdmsr(IDE_MSR_REG(IDE_CFG), &hi, &lo);168conf_data = lo;169break;170case PCI_IDE_DTC_REG:171_rdmsr(IDE_MSR_REG(IDE_DTC), &hi, &lo);172conf_data = lo;173break;174case PCI_IDE_CAST_REG:175_rdmsr(IDE_MSR_REG(IDE_CAST), &hi, &lo);176conf_data = lo;177break;178case PCI_IDE_ETC_REG:179_rdmsr(IDE_MSR_REG(IDE_ETC), &hi, &lo);180conf_data = lo;181break;182case PCI_IDE_PM_REG:183_rdmsr(IDE_MSR_REG(IDE_INTERNAL_PM), &hi, &lo);184conf_data = lo;185break;186default:187break;188}189190return conf_data;191}192193194