Lines Matching refs:rp
94 int (*check_unit)(struct rapl_package *rp, int cpu);
96 u64 (*compute_time_window)(struct rapl_package *rp, u64 val,
131 static void rapl_init_domains(struct rapl_package *rp);
140 static void package_power_limit_irq_save(struct rapl_package *rp);
186 struct rapl_package *rp = rd->rp;
193 rp->domains = NULL;
316 struct rapl_package *rp;
328 rp = rd->rp;
351 package_power_limit_irq_save(rp);
534 static void rapl_init_domains(struct rapl_package *rp)
538 struct rapl_domain *rd = rp->domains;
541 unsigned int mask = rp->domain_map & (1 << i);
546 rd->rp = rp;
548 if (i == RAPL_DOMAIN_PLATFORM && rp->id > 0) {
550 cpu_data(rp->lead_cpu).phys_proc_id);
563 if (rp->priv->limits[i] >= 2) {
569 if (rp->priv->limits[i] == 3) {
575 rd->regs[j] = rp->priv->regs[i][j];
603 struct rapl_package *rp = rd->rp;
608 units = rp->power_unit;
616 units = rp->energy_unit;
619 return rapl_defaults->compute_time_window(rp, value, to_raw);
695 struct rapl_primitive_info *rp = &rpi[prim];
699 if (!rp->name || rp->flag & RAPL_PRIMITIVE_DUMMY)
702 ra.reg = rd->regs[rp->id];
706 cpu = rd->rp->lead_cpu;
709 if (prim == FW_LOCK && rd->rp->priv->limits[rd->id] == 2) {
710 rp->mask = POWER_HIGH_LOCK;
711 rp->shift = 63;
714 if (rp->flag & RAPL_PRIMITIVE_DERIVED) {
719 ra.mask = rp->mask;
721 if (rd->rp->priv->read_raw(cpu, &ra)) {
726 value = ra.value >> rp->shift;
729 *data = rapl_unit_xlate(rd, rp->unit, value, 0);
741 struct rapl_primitive_info *rp = &rpi[prim];
747 cpu = rd->rp->lead_cpu;
748 bits = rapl_unit_xlate(rd, rp->unit, value, 1);
749 bits <<= rp->shift;
750 bits &= rp->mask;
754 ra.reg = rd->regs[rp->id];
755 ra.mask = rp->mask;
758 ret = rd->rp->priv->write_raw(cpu, &ra);
774 static int rapl_check_unit_core(struct rapl_package *rp, int cpu)
779 ra.reg = rp->priv->reg_unit;
781 if (rp->priv->read_raw(cpu, &ra)) {
783 rp->priv->reg_unit, cpu);
788 rp->energy_unit = ENERGY_UNIT_SCALE * 1000000 / (1 << value);
791 rp->power_unit = 1000000 / (1 << value);
794 rp->time_unit = 1000000 / (1 << value);
797 rp->name, rp->energy_unit, rp->time_unit, rp->power_unit);
802 static int rapl_check_unit_atom(struct rapl_package *rp, int cpu)
807 ra.reg = rp->priv->reg_unit;
809 if (rp->priv->read_raw(cpu, &ra)) {
811 rp->priv->reg_unit, cpu);
816 rp->energy_unit = ENERGY_UNIT_SCALE * 1 << value;
819 rp->power_unit = (1 << value) * 1000;
822 rp->time_unit = 1000000 / (1 << value);
825 rp->name, rp->energy_unit, rp->time_unit, rp->power_unit);
833 struct rapl_package *rp = (struct rapl_package *)info;
837 if (!(rp->power_limit_irq & PACKAGE_PLN_INT_SAVED)) {
838 rp->power_limit_irq = l & PACKAGE_THERM_INT_PLN_ENABLE;
839 rp->power_limit_irq |= PACKAGE_PLN_INT_SAVED;
855 static void package_power_limit_irq_save(struct rapl_package *rp)
860 smp_call_function_single(rp->lead_cpu, power_limit_irq_save_cpu, rp, 1);
867 static void package_power_limit_irq_restore(struct rapl_package *rp)
875 if (!(rp->power_limit_irq & PACKAGE_PLN_INT_SAVED))
880 if (rp->power_limit_irq & PACKAGE_THERM_INT_PLN_ENABLE)
927 static u64 rapl_compute_time_window_core(struct rapl_package *rp, u64 value,
939 value = (1 << y) * (4 + f) * rp->time_unit / 4;
941 if (value < rp->time_unit)
944 do_div(value, rp->time_unit);
952 static u64 rapl_compute_time_window_atom(struct rapl_package *rp, u64 value,
960 return (value) ? value *= rp->time_unit : rp->time_unit;
962 value = div64_u64(value, rp->time_unit);
1071 static void rapl_update_domain_data(struct rapl_package *rp)
1076 for (dmn = 0; dmn < rp->nr_domains; dmn++) {
1077 pr_debug("update %s domain %s data\n", rp->name,
1078 rp->domains[dmn].name);
1081 if (!rapl_read_data_raw(&rp->domains[dmn], prim,
1083 rp->domains[dmn].rdd.primitives[prim] = val;
1089 static int rapl_package_register_powercap(struct rapl_package *rp)
1096 rapl_update_domain_data(rp);
1099 for (rd = rp->domains; rd < rp->domains + rp->nr_domains; rd++) {
1102 pr_debug("register package domain %s\n", rp->name);
1104 rp->priv->control_type, rp->name,
1109 rp->name);
1113 rp->power_zone = power_zone;
1123 for (rd = rp->domains; rd < rp->domains + rp->nr_domains; rd++) {
1124 struct powercap_zone *parent = rp->power_zone;
1133 rp->priv->control_type,
1140 rp->name, rd->name);
1152 while (--rd >= rp->domains) {
1153 pr_debug("unregister %s domain %s\n", rp->name, rd->name);
1154 powercap_unregister_zone(rp->priv->control_type,
1161 static int rapl_check_domain(int cpu, int domain, struct rapl_package *rp)
1171 ra.reg = rp->priv->regs[domain][RAPL_DOMAIN_REG_STATUS];
1182 if (rp->priv->read_raw(cpu, &ra) || !ra.value)
1206 rd->rp->name, rd->name);
1222 static int rapl_detect_domains(struct rapl_package *rp, int cpu)
1229 if (!rapl_check_domain(cpu, i, rp)) {
1230 rp->domain_map |= 1 << i;
1234 rp->nr_domains = bitmap_weight(&rp->domain_map, RAPL_DOMAIN_MAX);
1235 if (!rp->nr_domains) {
1236 pr_debug("no valid rapl domains found in %s\n", rp->name);
1239 pr_debug("found %d domains on %s\n", rp->nr_domains, rp->name);
1241 rp->domains = kcalloc(rp->nr_domains + 1, sizeof(struct rapl_domain),
1243 if (!rp->domains)
1246 rapl_init_domains(rp);
1248 for (rd = rp->domains; rd < rp->domains + rp->nr_domains; rd++)
1255 void rapl_remove_package(struct rapl_package *rp)
1259 package_power_limit_irq_restore(rp);
1261 for (rd = rp->domains; rd < rp->domains + rp->nr_domains; rd++) {
1274 rp->name, rd->name);
1275 powercap_unregister_zone(rp->priv->control_type,
1279 powercap_unregister_zone(rp->priv->control_type,
1281 list_del(&rp->plist);
1282 kfree(rp);
1290 struct rapl_package *rp;
1292 list_for_each_entry(rp, &rapl_packages, plist) {
1293 if (rp->id == id
1294 && rp->priv->control_type == priv->control_type)
1295 return rp;
1306 struct rapl_package *rp;
1313 rp = kzalloc(sizeof(struct rapl_package), GFP_KERNEL);
1314 if (!rp)
1318 rp->id = id;
1319 rp->lead_cpu = cpu;
1320 rp->priv = priv;
1323 snprintf(rp->name, PACKAGE_DOMAIN_NAME_LENGTH,
1326 snprintf(rp->name, PACKAGE_DOMAIN_NAME_LENGTH, "package-%d",
1330 if (rapl_detect_domains(rp, cpu) || rapl_defaults->check_unit(rp, cpu)) {
1334 ret = rapl_package_register_powercap(rp);
1336 INIT_LIST_HEAD(&rp->plist);
1337 list_add(&rp->plist, &rapl_packages);
1338 return rp;
1342 kfree(rp->domains);
1343 kfree(rp);
1350 struct rapl_package *rp;
1355 list_for_each_entry(rp, &rapl_packages, plist) {
1356 if (!rp->power_zone)
1358 rd = power_zone_to_rapl_domain(rp->power_zone);
1391 struct rapl_package *rp;
1396 list_for_each_entry(rp, &rapl_packages, plist) {
1397 if (!rp->power_zone)
1399 rd = power_zone_to_rapl_domain(rp->power_zone);